// main.go
package main

import (
	"fmt"
	"plugin"
	"time"
)

func main() {
	for {
		test()
		time.Sleep(15 * time.Second)
		test()
		time.Sleep(15 * time.Second)
		test()
	}
}

func test() {
	// 打开插件, 注意同一个路径下的插件只能打开一次, 虽然没有“缓存”, 但已加载的插件无法替换
	plug, err := plugin.Open("../../plugins/01/plugin1.so")
	if err != nil {
		panic(err)
	}

	// 查找插件中的函数: SayHello
	sayHelloSymbol, err := plug.Lookup("SayHello")
	if err != nil {
		panic(err)
	}

	// 类型断言：转换为函数类型
	sayHelloFunc, ok := sayHelloSymbol.(func(string))
	if !ok {
		panic("SayHello symbol is not a function with expected signature")
	}

	// 调用函数
	sayHelloFunc("Alice")

	// 查找并读取变量: Version
	versionSymbol, err := plug.Lookup("Version")
	if err != nil {
		panic(err)
	}

	version, ok := versionSymbol.(*string)
	if !ok {
		panic("Version symbol is not a string pointer")
	}
	fmt.Println("插件版本:", *version)

	// 查找并调用 Init 函数
	initSymbol, err := plug.Lookup("Init")
	if err != nil {
		panic(err)
	}

	initFunc, ok := initSymbol.(func())
	if !ok {
		panic("Init symbol is not a function")
	}
	initFunc()
}
